/*
提升（hoisting）机制
*/

var v = 'hello';
function f() {
    console.log(v);  // 输出是undefined,变量声明在执行的时候，会把所有变量的声明都提升到当前作用域的最前面
    var v = 'world';
}
f();

function v1() {
    var a = 6;
    function a() {

    }
    console.log(a); // 输出：6，a首先指向[Function: a]，然后再被赋值为a=6
}
v1();

function v2() {
    var a;
    function a() {

    }
    console.log(a); // 输出 [Function: a], 函数提升优先级大于变量，声明过的变量名或函数名，不会再声明
}
v2();

function f1() {
    var n = 5;
    if(true){
        var n = 10;
    }
    console.log('f1:'+n);
}
f1();

/*
全局变量内存泄漏
 */

var s = 'hello';
for(var i=0;i<s.length;i++){
    console.log(s[i]);
}
console.log(i); // 5 ,循环结束后i仍然存在，成为全局变量，内存泄漏


/*
   es5只有全局作用域和函数作用域，没有块级作用域
 */

for(var i =0;i<10;i++){

}
console.log(i); // 输出10


/*
  函数定义时，已经确定变量的取值作用域
 */

var a2 = 10;
function f2() {
    console.log(a2);
}
function bar(f) {
    var a = 20;
    f();  // 输出10，因为函数创建时，已经确定了a的取值作用域
}
bar(f2());

